import numpy as np
import pandas as pd

pd.set_option('display.width',1000)
pd.set_option('display.max_rows',500)
pd.set_option('display.max_columns',500)

'''读取数据'''
df = pd.read_csv('pima-indians-diabetes.csv')
print(df.head())

'''列最小值为0时数据毫无意义：1.血浆葡萄糖浓度 2.舒张压 3.三头肌皮褶厚度 4.血清胰岛素 5.体重指数'''
print(df.describe())

'''在pandas的dataframe中，使用replace()函数将列中0为无效的值标记为NAN'''
nan_col_columns=['Plasma_glucose_concentration','blood_pressure','Triceps_skin_fold_thickness','serum_insulin','BMI']
df[nan_col_columns]=df[nan_col_columns].replace(0,np.NAN)
'''计算每一列中缺失值的数量'''
print(df.isnull().sum())

'''对缺失值较多的特征，新增一个特征，表示这个特征是否缺失'''
df['Triceps_skin_fold_thickness_Missing']=df['Triceps_skin_fold_thickness'].apply(lambda x:1 if(pd.isnull(x)) else 0)
print(df[['Triceps_skin_fold_thickness','Triceps_skin_fold_thickness_Missing']].head(10))

import matplotlib.pyplot as plt
import seaborn as sns

sns.countplot(x='Triceps_skin_fold_thickness_Missing',hue='Target',data=df)
plt.show()

df['serum_insulin_Missing']=df['serum_insulin'].apply(lambda x:1 if pd.isnull(x) else 0)
sns.countplot(x='serum_insulin_Missing',hue="Target",data=df)
plt.show()

'''特征是否缺失好像和目标没有什么关系'''
df.drop(['Triceps_skin_fold_thickness_Missing','serum_insulin_Missing'],axis=1,inplace=True)

'''感觉特征缺失是随机的，用中值填补缺失值'''
medians=df.median()
df=df.fillna(medians)

print(df.isnull().sum())

'''数据标准化'''
y_train=df['Target']
x_train=df.drop(['Target'],axis=1)

'''用于保存特征工程之后的结果'''
feat_names=x_train.columns

from sklearn.preprocessing import StandardScaler
ss_x=StandardScaler()

'''分别对训练和测试数据的特征进行标准化处理'''
'''标准化数据，保证每个维度的特征数据方差为1，均值为0，
   使得预测结果不会被某些维度过大的特征值而主导'''
'''先拟合数据再标准化'''
x_train=ss_x.fit_transform(x_train)

'''特征处理结果存为文件'''
x_train=pd.DataFrame(columns=feat_names,data=x_train)
train=pd.concat([x_train,y_train],axis=1)
train.to_csv('FE_pima-indians-diabetes.csv',index=False,header=True)

print(train.head())









